/************************************************************************
 * <br>
 * <ul>
 * <li>版权所有：唐山弘川科技有限公司 2009－2020</li>
 * <li>创建日期：2009-8-4</li>
 * <li>初始作者：刘川</li>
 * </ul>
 * <ul>
 * <b>修订历史</b>
 * <li>1、</li>
 * </ul>
 ***********************************************************************/
package com.hy.enterprise.framework.util.jpa ;

import javax.persistence.Entity ;
import javax.persistence.ManyToMany ;
import javax.persistence.ManyToOne ;
import javax.persistence.OneToMany ;
import javax.persistence.OneToOne ;

import com.hy.enterprise.framework.util.lang.AnnotationUtil;

//import com.vsoft.libra.enterprise.framework.util.lang.AnnotationUtil ;

/**
 * <ul>
 * <li>设计作者：刘川</li>
 * <li>设计日期：2009-8-4</li>
 * <li>设计时间：下午01:21:22</li>
 * <li>设计目的：JPA操作助手类</li>
 * </ul>
 * <ul>
 * <b>修订历史</b>
 * <li>1、</li>
 * </ul>
 */
public class JpaUtil
{
	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-8</li>
	 * <li>设计时间：上午12:18:06</li>
	 * <li>设计目的：获取实体类名称</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param clazz
	 * @return
	 */
	public static String getEntityName (
	                                     Class < ? > clazz )
	{
		if ( JpaUtil
		            .isEntity ( clazz ) )
		{
			Entity entity =
			                AnnotationUtil
			                              .getAnnotation (
			                                               clazz ,
			                                               Entity.class ) ;
			String entityName =
			                    entity
			                          .name ( ) ;
			if ( ( null == entityName )
			     || ( entityName
			                    .trim ( )
			                    .length ( ) == 0 ) )
			{
				return clazz
				            .getName ( ) ;
			}
			else
			{
				return entityName ;
			}
		}
		else
		{
			return null ;
		}
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-8</li>
	 * <li>设计时间：上午12:14:30</li>
	 * <li>设计目的：判断指定类型是否持久化数据模型类型</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param clazz
	 * @return
	 */
	public static boolean isEntity (
	                                 Class < ? > clazz )
	{
		return AnnotationUtil
		                     .isClassAnnotationPresent (
		                                                 clazz ,
		                                                 Entity.class ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-4</li>
	 * <li>设计时间：下午01:21:52</li>
	 * <li>设计目的：判断指定类型是否为JPA实体类</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param targetClass
	 * @return
	 */
	public static boolean isEntityTargetInstance (
	                                               Class < ? > targetClass )
	{
		return targetClass
		                  .getAnnotation ( Entity.class ) != null ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-4</li>
	 * <li>设计时间：下午01:22:47</li>
	 * <li>设计目的：判断指定类型的指定属性名称是否标注了{@link javax.persistence.ManyToMany}注解</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param clazz
	 * @param propertyName
	 * @return
	 */
	public static boolean isManyToMany (
	                                     Class < ? > clazz ,
	                                     String propertyName )
	{
		boolean result =
		                 false ;
		try
		{
			result =
			         AnnotationUtil
			                       .isFieldAnnotationPresent (
			                                                   clazz ,
			                                                   ManyToMany.class ,
			                                                   propertyName )
			                 || AnnotationUtil
			                                  .isGetterAnnotationPresent (
			                                                               clazz ,
			                                                               ManyToMany.class ,
			                                                               propertyName ) ;

		}
		catch ( NoSuchFieldException noSuchFieldException )
		{
			result =
			         false ;
		}
		catch ( NoSuchMethodException noSuchMethodException )
		{
			result =
			         false ;
		}
		return result ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-4</li>
	 * <li>设计时间：下午01:24:47</li>
	 * <li>设计目的：判断指定类型的指定属性名称是否标注了{@link javax.persistence.ManyToOne}注解</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param clazz
	 * @param propertyName
	 * @return
	 */
	public static boolean isManyToOne (
	                                    Class < ? > clazz ,
	                                    String propertyName )
	{
		boolean result =
		                 false ;
		try
		{
			result =
			         AnnotationUtil
			                       .isFieldAnnotationPresent (
			                                                   clazz ,
			                                                   ManyToOne.class ,
			                                                   propertyName )
			                 || AnnotationUtil
			                                  .isGetterAnnotationPresent (
			                                                               clazz ,
			                                                               ManyToOne.class ,
			                                                               propertyName ) ;

		}
		catch ( NoSuchFieldException noSuchFieldException )
		{
			result =
			         false ;
		}
		catch ( NoSuchMethodException noSuchMethodException )
		{
			result =
			         false ;
		}
		return result ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-4</li>
	 * <li>设计时间：下午01:26:18</li>
	 * <li>设计目的：判断指定类型的指定属性名称是否标注了{@link javax.persistence.OneToMany}注解</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param clazz
	 * @param propertyName
	 * @return
	 */
	public static boolean isOneToMany (
	                                    Class < ? > clazz ,
	                                    String propertyName )
	{
		boolean result =
		                 false ;
		try
		{
			result =
			         AnnotationUtil
			                       .isFieldAnnotationPresent (
			                                                   clazz ,
			                                                   OneToMany.class ,
			                                                   propertyName )
			                 || AnnotationUtil
			                                  .isGetterAnnotationPresent (
			                                                               clazz ,
			                                                               OneToMany.class ,
			                                                               propertyName ) ;

		}
		catch ( NoSuchFieldException noSuchFieldException )
		{
			result =
			         false ;
		}
		catch ( NoSuchMethodException noSuchMethodException )
		{
			result =
			         false ;
		}
		return result ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-4</li>
	 * <li>设计时间：下午01:27:04</li>
	 * <li>设计目的：判断指定类型的指定属性名称是否标注了{@link javax.persistence.OneToOne}注解</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param clazz
	 * @param propertyName
	 * @return
	 */
	public static boolean isOneToOne (
	                                   Class < ? > clazz ,
	                                   String propertyName )
	{
		boolean result =
		                 false ;
		try
		{
			result =
			         AnnotationUtil
			                       .isFieldAnnotationPresent (
			                                                   clazz ,
			                                                   OneToOne.class ,
			                                                   propertyName )
			                 || AnnotationUtil
			                                  .isGetterAnnotationPresent (
			                                                               clazz ,
			                                                               OneToOne.class ,
			                                                               propertyName ) ;

		}
		catch ( NoSuchFieldException noSuchFieldException )
		{
			result =
			         false ;
		}
		catch ( NoSuchMethodException noSuchMethodException )
		{
			result =
			         false ;
		}
		return result ;
	}

	/**
	 * 构造函数
	 */
	private JpaUtil ( )
	{
		super ( ) ;
	}
}
